1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34 import java.util.Arrays;
35 import javax.management.*;
36 import javax.management.modelmbean.DescriptorSupport;
37
38 public class EqualsHashCodeTest {
39 public static void main(String[] args) throws Exception {
40 int[] squares = {1, 4, 9, 16};
41 int[] serauqs = {16, 9, 4, 1};
42 int[][] numbers = {squares, serauqs};
43
44 Descriptor sq1 =
45 new ImmutableDescriptor(new String[] {"name", "rank", "squares",
46 "null", "numbers"},
47 new Object[] {"Foo McBar", "lowly",
48 squares.clone(), null,
49 numbers});
50 Descriptor sq2 =
51 new DescriptorSupport(new String[] {"Name", "Rank", "SquareS",
52 "NULL", "NuMbErS"},
53 new Object[] {"Foo McBar", "lowly",
54 squares.clone(), null,
55 numbers});
56 Descriptor sq3 = (Descriptor) sq2.clone();
57 Descriptor sq4 = ImmutableDescriptor.union(sq1, sq2);
58
59 String[] names = sq1.getFieldNames();
60 Object[] values = sq1.getFieldValues((String[]) null);
61 Object[] values2 = sq1.getFieldValues(names);
62 if (!Arrays.deepEquals(values, values2)) {
63 throw new Exception("Arrays not equal: " +
64 Arrays.deepToString(values) + Arrays.deepToString(values2));
65 }
66
67 int expectedHashCode = 0;
68 for (int i = 0; i < names.length; i++) {
69 Object value = values[i];
70 int h;
71 if (value == null)
72 h = 0;
73 else if (value instanceof int[])
74 h = Arrays.hashCode((int[]) value);
75 else if (value instanceof Object[])
76 h = Arrays.deepHashCode((Object[]) value);
77 else
78 h = value.hashCode();
79 expectedHashCode += names[i].toLowerCase().hashCode() ^ h;
80 }
81 for (Descriptor d : new Descriptor[] {sq1, sq2, sq3, sq4}) {
82 System.out.println("Testing hashCode for " +
83 d.getClass().getName() + ": " + d);
84 if (d.hashCode() != expectedHashCode) {
85 throw new Exception("Bad hashCode: expected " +
86 expectedHashCode + ", got " + d.hashCode() +
87 ", for " + d);
88 }
89 }
90
91 int i;
92 for (i = 0; i < names.length; i++) {
93 if (names[i].equals("squares")) {
94 values[i] = serauqs.clone();
95 break;
96 }
97 }
98 if (i >= names.length)
99 throw new Exception("Internal error: no squares name");
100 Descriptor qs1 = new ImmutableDescriptor(names, values);
101 values[i] = serauqs.clone();
102 Descriptor qs2 = new DescriptorSupport(names, values);
103
104 System.out.println("Testing equality...");
105
106 Object[][] equivalenceClasses = {
107 {sq1, sq2, sq3, sq4},
108 {qs1, qs2},
109 };
110 for (Object[] equivClass : equivalenceClasses) {
111 for (Object a : equivClass) {
112 for (Object b : equivClass) {
113 if (!a.equals(b)) {
114 throw new Exception("Should be equal but not: " +
115 a + " :: " + b);
116 }
117 }
118 for (Object[] equivClass2 : equivalenceClasses) {
119 if (equivClass2 == equivClass)
120 continue;
121 for (Object b : equivClass2) {
122 if (a.equals(b)) {
123 throw new Exception("Should not be equal: " +
124 a + " :: " + b);
125 }
126 }
127 }
128 }
129 }
130
131 System.out.println("TEST PASSED");
132 }
133 }